02|双指针 / 滑动窗口(知识笔记)
对应课程:lessons/02-prefix-diff-two-pointers/02-two-pointers-and-sliding-window.md
识别信号
- 序列/字符串
- 想要
,并且窗口扩张/收缩能维持某个约束
成立前提(最关键的一句话)
左指针只增不减。
这背后需要一种“单调性”:
- 右端点右移会让约束更容易被破坏(或更容易满足),
- 从而左端点只需要单调右移就能恢复(或继续满足)约束。
典型能成立的条件:
- 数组非负 → 窗口和随右移不减
- “至多 K 次/至多 K 种” → 扩张更容易违规,收缩会缓解
两种最常用目标
A) 最短满足窗口
- r 右移直到满足
- l 右移尽量缩小(保持仍满足)
B) 最长满足窗口
- r 右移扩张
- 若违规:l 右移直到重新满足
高频题型
- 至多 K 个不同元素
- 至多 K 次修改/翻转
- 子数组满足某个“可维护”的条件(用计数表/窗口和)
常见坑
- 条件不单调:例如含负数时“窗口和 >= X”并不单调
- 计数表更新顺序写错(先移指针还是先改计数)
- 答案更新时机写错(收缩前/后)
自检
- [ ] 我能保证 l 只增不减吗?如果需要回退,模型大概率错
- [ ] 手推一个最小样例看 l,r 的变化
个人坑位
- (例)我经常在 while 收缩里把
cnt更新漏掉